package types

import (
	"math"
)

// COCO关键点索引常量
const (
	Nose          = 0
	LeftEye       = 1
	RightEye      = 2
	LeftEar       = 3
	RightEar      = 4
	LeftShoulder  = 5
	RightShoulder = 6
	LeftElbow     = 7
	RightElbow    = 8
	LeftWrist     = 9
	RightWrist    = 10
	LeftHip       = 11
	RightHip      = 12
	LeftKnee      = 13
	RightKnee     = 14
	LeftAnkle     = 15
	RightAnkle    = 16
)

// Point 表示2D坐标点
type Point struct {
	X          float64 `json:"x"`          // X坐标
	Y          float64 `json:"y"`          // Y坐标
	Confidence float64 `json:"confidence"` // 置信度
}

// PoseData 表示17个COCO关键点数据
type PoseData struct {
	Keypoints [17]Point `json:"keypoints"` // 17个COCO关键点
	Timestamp int64     `json:"timestamp"` // 时间戳
	FrameID   int       `json:"frame_id"`  // 帧ID
}

// PoseAnalysisResult 姿势分析结果
type PoseAnalysisResult struct {
	IsStandingStraight bool `json:"is_standing_straight"`

	// 头部姿态检测
	HeadTurnLeft     float64 `json:"head_turn_left"`     // 头部左转角度(度)
	HeadTurnRight    float64 `json:"head_turn_right"`    // 头部右转角度(度)
	HeadTiltLeft     float64 `json:"head_tilt_left"`     // 头部左歪角度(度)
	HeadTiltRight    float64 `json:"head_tilt_right"`    // 头部右歪角度(度)
	HeadTiltForward  float64 `json:"head_tilt_forward"`  // 头部前倾角度(度)
	HeadTiltBackward float64 `json:"head_tilt_backward"` // 头部后仰角度(度)
	HeadUpward       float64 `json:"head_upward"`        // 头部上扬角度(度)

	// 肩部姿态检测
	ShoulderLevel      float64 `json:"shoulder_level"`      // 两肩水平度(度)
	ShoulderRetraction float64 `json:"shoulder_retraction"` // 两肩后张角度(度)

	// 身体姿态检测
	BodyTurnLeft     float64 `json:"body_turn_left"`     // 身体左转角度(度)
	BodyTurnRight    float64 `json:"body_turn_right"`    // 身体右转角度(度)
	BodyTiltLeft     float64 `json:"body_tilt_left"`     // 身体左歪角度(度)
	BodyTiltRight    float64 `json:"body_tilt_right"`    // 身体右歪角度(度)
	BodyLeanForward  float64 `json:"body_lean_forward"`  // 身体前倾角度(度)
	BodyLeanBackward float64 `json:"body_lean_backward"` // 身体后仰角度(度)

	// 腿部姿态检测
	LegsStraight bool `json:"legs_straight"` // 腿部是否笔直

	// 评分和置信度
	OverallScore float64 `json:"overall_score"` // 总体评分(0-100)
	Confidence   float64 `json:"confidence"`    // 检测置信度
	Timestamp    int64   `json:"timestamp"`
}

// CalibrationData 校准数据
type CalibrationData struct {
	PersonID           string     `json:"person_id"`           // 人员ID
	ReferencePoses     []PoseData `json:"reference_poses"`     // 参考姿势
	AveragePose        PoseData   `json:"average_pose"`        // 平均姿势
	StandardDeviations [17]Point  `json:"standard_deviations"` // 标准差
	Calibrated         bool       `json:"calibrated"`          // 是否校准
	CreatedAt          int64      `json:"created_at"`          // 创建时间
	UpdatedAt          int64      `json:"updated_at"`          // 更新时间
}

// Distance 计算两点间距离
func (p1 Point) Distance(p2 Point) float64 {
	dx := p1.X - p2.X
	dy := p1.Y - p2.Y
	return math.Sqrt(dx*dx + dy*dy)
}

// Angle 计算三点形成的角度(以p2为顶点)
func Angle(p1, p2, p3 Point) float64 {
	// 计算向量
	v1x := p1.X - p2.X
	v1y := p1.Y - p2.Y
	v2x := p3.X - p2.X
	v2y := p3.Y - p2.Y

	// 计算点积
	dot := v1x*v2x + v1y*v2y

	// 计算向量长度
	len1 := math.Sqrt(v1x*v1x + v1y*v1y)
	len2 := math.Sqrt(v2x*v2x + v2y*v2y)

	// 避免除零
	if len1 == 0 || len2 == 0 {
		return 0
	}

	// 计算角度(弧度转度)
	cosAngle := dot / (len1 * len2)
	cosAngle = math.Max(-1, math.Min(1, cosAngle)) // 限制在[-1,1]范围内
	return math.Acos(cosAngle) * 180 / math.Pi
}

// IsValid 检查关键点是否有效
func (p Point) IsValid() bool {
	return p.Confidence > 0.5 && p.X > 0 && p.Y > 0
}
